# 开发人员：萌狼蓝天
# 博客：Https://mllt.cc
# 笔记：Https://cnblogs.com/mllt
# 哔哩哔哩/微信公众号：萌狼蓝天
# 开发时间：2022/4/30
# Coding：UTF-8
import os.path
import time
import random
import pygame

# 定义好游戏窗口宽高和帧率数值
WINDOW_width = 800
WINDOW_height = 600
GAME_FPS = 120

# 定义颜色
COLOR_user_background = (47, 64, 86)
COLOR_font_tips = (1, 170, 237)
COLOR_background = (238, 238, 238)
# 游戏状态
var_running = False
var_end = False


# ----------------------------------------------------------------------------

class User(pygame.sprite.Sprite):  # 父类型是pygame.sprite.Sprite
    def __init__(self):
        # 运行内置Sprite类初始化程序
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("img/bird.png").convert_alpha()
        self.rect = self.image.get_rect()  # 获取包围图片的矩形
        self.rect.center = (100, WINDOW_height / 2)  # 将精灵放在屏幕中间居左
        self.speedy = 2  # 控制精灵移动速度
        self.mask=pygame.mask.from_surface(self.image)

    def update(self):
        key_pressed = pygame.key.get_pressed()  # 监听键盘，按下键返回ture,否flase
        if self.rect.top >= self.rect.height:
            if key_pressed[pygame.K_UP]:  # 键盘方向键上键
                self.rect.y -= self.speedy
        if self.rect.bottom <= (WINDOW_height - self.rect.height):
            if key_pressed[pygame.K_DOWN]:  # 键盘方向键下键
                self.rect.y += self.speedy


class Obstacle(pygame.sprite.Sprite):
    def __init__(self, seed):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("img/pillar.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.center = (WINDOW_width, seed)
        self.mask = pygame.mask.from_surface(self.image)
    def update(self):
        self.rect.x -= random.randint(1, 10)
        if self.rect.right < 0:
            self.kill()  # 清除


def game_draw():
    user = User()  # 获取用户精灵对象
    all_sprite_user.add(user)
    return user


def game_addObstacle():
    seed = random.randint(int(WINDOW_height / 2 - 100), int(WINDOW_height / 2 + 100))
    obstacle = Obstacle(seed)  # 获取障碍物对象
    all_sprites.add(obstacle)  # 将障碍物精灵添加到精灵组
    return obstacle


def game_update():
    all_sprites.update()  # 更新内容
    all_sprite_user.update()
    all_sprite_user.draw(val_screen)
    all_sprites.draw(val_screen)  # 绘画在屏幕上


if __name__ == '__main__':
    # 基本
    pygame.init()  # Pygame模块初始化
    all_sprite_user = pygame.sprite.Group()  # 创建精灵组
    all_sprites = pygame.sprite.Group()  # 创建精灵组
    # 文本模板设置开始
    font_tips = pygame.font.Font("fonts/fang_zheng_kai_ti_GBK.ttf", 18)  # (文本内容，字体大小) 建议自己设置字体避免中文显示问题
    # 文本模板设置结束
    val_screen = pygame.display.set_mode((WINDOW_width, WINDOW_height))  # 创建游戏窗口
    pygame.display.set_caption("飞翔的小鸟@萌狼工作室")  # 设置窗口标题栏文字
    val_clock = pygame.time.Clock()  # Clock时钟对象，以确保游戏以所设定的FPS运行
    var_running = True  # 设置游戏状态为启动
    var_count = 0  # 运行后刷新的帧数。用于计算帧率   # 帧数/时间 = 每秒多少帧
    var_time_start = time.time()  # 获取系统当前时间，记录为开始运行时间
    var_nandu = 0
    var_time_last = var_time_start
    user = game_draw()
    while not var_end:
        val_clock.tick(GAME_FPS)  # 设置帧率（tick告诉pygame一秒执行多少次）
        # 设置窗口关闭功能
        for event in pygame.event.get():  # pygame内部保存自上一帧以来发生的所有事件
            if event.type == pygame.QUIT:  # 用户点击关闭按钮
                var_end = True
        # 【注意】上述监听必须写在循环体内，否则会导致运行的窗口处于无响应状态
       
        while var_running:
            for event in pygame.event.get():  # pygame内部保存自上一帧以来发生的所有事件
                if event.type == pygame.QUIT:  # 用户点击关闭按钮
                    var_running=False
                    var_end = True
            # 计算帧率
            var_count += 1
            var_time_now = time.time()
            var_fps = var_count / (var_time_now - var_time_start)
            # 将帧率以文字的方式绘制在窗口上
            text_img_tips_ftp = font_tips.render("  FPS:" + str(int(var_fps)), True, COLOR_font_tips)
            # 绘制屏幕
            val_screen.blit(pygame.image.load("img/background.jpg"), (0, 0))
            # val_screen.fill(COLOR_background)  # 使用指定颜色填充屏幕
            val_screen.blit(text_img_tips_ftp, (0, 0))
            if var_time_now - var_time_last > var_nandu:
                obstacle = game_addObstacle()
                var_time_last = var_time_now
                var_nandu = 0.5
            game_update()
            pygame.display.flip()  # 翻转（类似刷新，但不是刷新）屏幕
            for i in all_sprites:
                if not pygame.sprite.collide_mask(user, i) is None:
                    font_tips_end = pygame.font.Font("fonts/fang_zheng_kai_ti_GBK.ttf",
                                                     32)  # (文本内容，字体大小) 建议自己设置字体避免中文显示问题
                    text_img_tips_end = font_tips_end.render("游戏失败", True, COLOR_background)
                    val_screen.blit(text_img_tips_end,
                                    (WINDOW_width / 2 - text_img_tips_end.get_rect().width/2 , WINDOW_height / 2-text_img_tips_end.get_rect().height))
                    var_running = False
                    pygame.display.flip()  # 翻转（类似刷新，但不是刷新）屏幕
        # 不在运行中，也就是暂停状态



    # 退出游戏程序
    pygame.quit()
